Рекурсивная агрегация данных в древовидной структуре

Редактировал(а) Alexandr Fokin 2023/12/16 14:12

WITH RECURSIVE r AS (

-- Нижний уровень дерева (наиболее отдаленный от корня)
SELECT distinct
 1 AS i,
  s.id,
  s.name,
  s.parent,
 --Локальная сумма (на текущем уровне)
 sum(COALESCE (t.sum, 0))
   over (PARTITION by s.id)
  as localSum,
 -- Глобальная сумма (агрегирует локальную сумму и сумму подуровне)
 sum(COALESCE (t.sum, 0))
   over (PARTITION by s.id)
  as globalSum
from storage s
 left join transaction t
  on s.id = t.storage
where
  s.id not in
  (
  select s2.parent
  from storage s2
  where s2.parent is not null
  )
UNION

-- Последующий уровень вверх
SELECT distinct
  i+1 AS i,
  s.id,
  s.name,
  s.parent,
 --Локальная сумма (на текущем уровне)
 sum(COALESCE (t.sum, 0))
   over (PARTITION by s.id)
  as localSum,
 -- Глобальная сумма (агрегирует локальную сумму и сумму подуровне)
 sum(COALESCE (t.sum, 0) + r.globalSum)
   over (PARTITION by s.id)
  as globalSum
FROM storage s
 join r
  on r.parent = s.id
 left join transaction t
  on s.id = t.storage
)


SELECT
 r.*
FROM r
order by r.id

Aggregate functions are not allowed in a recursive query. Is there an alternative way to write this query?
https://stackoverflow.com/questions/57299663/aggregate-functions-are-not-allowed-in-a-recursive-query-is-there-an-alternativ

Теги: